#ifndef __HAL_SPI_H__
#define __HAL_SPI_H__

#include "gbl_types.h"
#include "os_api.h"
/*===========================================================================

                          Type definition.

===========================================================================*/


typedef enum SPI_CLK_ENUM
{	
	SPI_CLK_INVALID=-1,
	SPI_CLK_812_5KHZ=0,
	SPI_CLK_1_625MHZ,
	SPI_CLK_3_25MHZ,
	SPI_CLK_6_5MHZ,
	SPI_CLK_13MHZ,
	SPI_CLK_26MHZ,
	SPI_CLK_52MHZ,
	SPI_CLK_100KHZ,
	SPI_CLK_200KHZ,
	SPI_CLK_300KHZ,
	SPI_CLK_400KHZ,
	SPI_CLK_500KHZ,
	SPI_CLK_600KHZ,
	SPI_CLK_700KHZ,
	SPI_CLK_800KHZ,
	SPI_CLK_900KHZ,
	SPI_CLK_1MHZ,    
	SPI_CLK_MAX,
}SPI_CLK_E;

typedef enum SPI_MODE_ENUM
{	
	SPI_MODE_INVALID=-1,
	SPI_MODE0=0,
	SPI_MODE1,
	SPI_MODE2,
	SPI_MODE3,
	SPI_MODE_MAX,
}SPI_MODE_E;


// 详见引脚与GPIO对应表
typedef enum SPI_PORT_ENUM
{
	SPI_PORT_INVALID = -1,
	SPI_PORT0 = 0,	//GPIO16-GPIO19	//SSP0
	SPI_PORT1 = 1,	//GPIO33-GPIO36	//SSP0
	SPI_PORT2 = 2,	//GPIO04-GPIO07	//SSP1
	SPI_PORT3 = 3,	//GPIO12-GPIO15	//SSP2
	SPI_PORT4 = 4,	//GPIO33-GPIO36	//SSP2
	
	SPI_PORT_MAX,
}SPI_PORT_E;

/*===========================================================================

                          INTERNAL FUNCTION DECLARATIONS

===========================================================================*/
/*****************************************************************
* Function: hal_SpiInit
*
* Description:
* 	该函数用于初始化 SPI，应在使用 SPI 其他 API 前调用。
* 
* Parameters:
* 	port	  	[in] 	SPI 通道选择。
* 	spimode	  	[in] 	SPI 模式选择。
* 	spiclk	  	[in] 	SPI 时钟频率设置。
* 	gpiocs	  	[in] 	SPI cs 是否使用gpio控制
*                       置TRUE时，将spi cs管脚改为GPIO output功能，由软件来控制cs输出低或输出高；
*                       某些特殊device要求一包数据传输时，中途不能有cs拉高，将这个参数置为TRUE即可支持。
* Return:
* 	0 函数执行成功
*	-1 函数执行失败
*
*****************************************************************/
int hal_SpiInit(SPI_PORT_E port, SPI_MODE_E mode, SPI_CLK_E clk, BOOL gpiocs);

/*****************************************************************
* Function: hal_SpiWriteRead
*
* Description:
* 	该函数用于通过 SPI 同时发送和接收数据。
* 
* Parameters:
* 	port	  	[in] 	SPI 通道选择。
* 	inbuf	  	[in] 	SPI 发送数据。
* 	outbuf	  	[out] 	SPI 接收数据。
* 	len	  		[in] 	SPI 发送和接收数据的长度,最大1024。
* Return:
* 	0 函数执行成功
*	-1 函数执行失败
*
*****************************************************************/
int hal_SpiWriteRead(SPI_PORT_E port, UINT8 *rbuf, UINT8 *wbuf, UINT32 len);

/*****************************************************************
* Function: hal_SpiWrite
*
* Description:
* 	该函数用于通过 SPI 发送数据。
* 
* Parameters:
* 	port	  	[in] 	SPI 通道选择。
* 	inbuf	  	[in] 	SPI 发送数据。
* 	len	  		[in] 	SPI 发送数据的长度,最大1024。
* Return:
* 	0 函数执行成功
*	-1 函数执行失败
*
*****************************************************************/
int hal_SpiWrite(SPI_PORT_E port, UINT8 *wbuf, UINT32 len);

/*****************************************************************
* Function: hal_SpiRead
*
* Description:
* 	该函数用于通过 SPI 接收数据。
* 
* Parameters:
* 	port	  	[in] 	SPI 通道选择。
* 	outbuf	  	[out] 	SPI 接收数据。
* 	len	  		[in] 	SPI 接收数据的长度,最大1024。
* Return:
* 	0 函数执行成功
*	-1 函数执行失败
*
*****************************************************************/
int hal_SpiRead(SPI_PORT_E port, UINT8 *rbuf, UINT32 len);


/*****************************************************************
* Function: hal_SpiWriteReadDma
*
* Description:
* 	该函数用于通过 SPI 通过DMA同时发送和接收数据。
* 
* Parameters:
* 	port	  	[in] 	SPI 通道选择。
* 	inbuf	  	[in] 	SPI 发送数据。
* 	outbuf	  	[out] 	SPI 接收数据。
* 	len	  		[in] 	SPI 发送和接收数据的长度,最大1024。
* Return:
* 	0 函数执行成功
*	-1 函数执行失败
*
*****************************************************************/
int hal_SpiWriteReadDma(SPI_PORT_E port, UINT8 *rbuf, UINT8 *wbuf, UINT32 len);

/*****************************************************************
* Function: hal_SpiWriteDma
*
* Description:
* 	该函数用于通过 SPI 通过DMA发送数据。
* 
* Parameters:
* 	port	  	[in] 	SPI 通道选择。
* 	inbuf	  	[in] 	SPI 发送数据。
* 	len	  		[in] 	SPI 发送数据的长度,最大1024。
* Return:
* 	0 函数执行成功
*	-1 函数执行失败
*
*****************************************************************/
int hal_SpiWriteDma(SPI_PORT_E port, UINT8 *wbuf, UINT32 len);


/*****************************************************************
* Function: hal_SpiReadDma
*
* Description:
* 	该函数用于通过 SPI 通过DMA接收数据。
* 
* Parameters:
* 	port	  	[in] 	SPI 通道选择。
* 	outbuf	  	[out] 	SPI 接收数据。
* 	len	  		[in] 	SPI 接收数据的长度,最大1024。
* Return:
* 	0 函数执行成功
*	-1 函数执行失败
*
*****************************************************************/
int hal_SpiReadDma(SPI_PORT_E port, UINT8 *rbuf, UINT32 len);

#endif
